查看原文
其他

R中强大的apply、tapply、lapply、sapply、mapply家族

2017-08-29 miffery 临床科研与meta分析

批量处理函数有很重要的apply族函数:lapply sapply apply tapply mapply。比起传统的for,while常常能获得更好的性能。


apply函数(对一个数组按行或者按列进行计算):

使用格式为:

apply(X, MARGIN, FUN, ...)

其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。
示例代码:


> y<-matrix(2:13,ncol=3,4) > y [,1] [,2] [,3] [1,] 2 6 10 [2,] 3 7 11 [3,] 4 8 12 [4,] 5 9 13 > apply(y,1,sum) [1] 18 21 24 27 > apply(y,2,mean) [1] 3.5 7.5 11.5> apply(y,2,function(x)mean(x)+2) [1] 5.5 9.5 13.5


函数lapply与函数sapply:

lapply的使用格式为:

lapply(X, FUN, ...)

lapply的返回值是和一个和X有相同的长度的list对象,这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中X为List对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。

函数sapply是函数lapply的一个特殊情形,对一些参数的值进行了一些限定,其使用格式为:

sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)

sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果参数simplify=TRUE,则函数sapply的返回值不是一个list,而是一个矩阵;若simplify=FALSE,则函数sapply的返回值仍然是一个list。

> y<-list(a=1:4,b=3:6,c=5:9) > y $a [1] 1 2 3 4 $b [1] 3 4 5 6 $c [1] 5 6 7 8 9 > lapply(y,function(x)x+1) $a [1] 2 3 4 5 $b [1] 4 5 6 7 $c [1] 6 7 8 9 10 > sapply(y,function(x)x+1) $a [1] 2 3 4 5 $b [1] 4 5 6 7 $c [1] 6 7 8 9 10


函数mapply:

函数mapply是函数sapply的变形版,mapply 将函数 FUN 依次应用每一个参数的第一个元素、第二个元素、第三个元素上。函数mapply的使用格式如下:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)

其中参数MoreArgs表示函数FUN的参数列表。

> a<-matrix(1:12,c(3,4)) > a [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > mapply(function(x,y,z)x+1+y+z,a[,1],a[,2],a[,3]) [1] 13 16 19


tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

x是需要处理的向量,INDEX是因子(因子列表),FUN是需要执行的函数,simplify指是否简化输入结果(考虑sapply对于lapply的简化)

> n <- 17 > fac <- factor(rep(1:3, length = n), levels = 1:5) > fac [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 Levels: 1 2 3 4 5 > table(fac) fac 1 2 3 4 5 6 6 5 0 0 > tapply(1:n, fac, sum) 1 2 3 4 5 51 57 45 NA NA > tapply(1:n, fac, sum, simplify = FALSE) $`1` [1] 51 $`2` [1] 57 $`3` [1] 45 $`4` NULL $`5` NULL > tapply(1:n, fac, range) $`1` [1] 1 16 $`2` [1] 2 17 $`3` [1] 3 15 $`4` NULL $`5` NULL


加入临床科研讨论群,请加13738062354或者pj1989zzj为好友,注明加群,就会拉你进群了。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存